package com.michael.leetcode;

import lombok.extern.slf4j.Slf4j;

import java.util.*;

/**
 * 211. 添加与搜索单词 - 数据结构设计
 * 请你设计一个数据结构，支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。
    实现词典类 WordDictionary ：
    WordDictionary() 初始化词典对象
    void addWord(word) 将 word 添加到数据结构中，之后可以对它进行匹配
    bool search(word) 如果数据结构中存在字符串与 word 匹配，则返回 true ；否则，返回  false 。word 中可能包含一些 '.' ，每个 . 都可以表示任何一个字母。

    示例：
    输入：
    ["WordDictionary","addWord","addWord","addWord","search","search","search","search"]
    [[],["bad"],["dad"],["mad"],["pad"],["bad"],[".ad"],["b.."]]
    输出：
    [null,null,null,null,false,true,true,true]
    解释：
    WordDictionary wordDictionary = new WordDictionary();
    wordDictionary.addWord("bad");
    wordDictionary.addWord("dad");
    wordDictionary.addWord("mad");
    wordDictionary.search("pad"); // 返回 False
    wordDictionary.search("bad"); // 返回 True
    wordDictionary.search(".ad"); // 返回 True
    wordDictionary.search("b.."); // 返回 True

    提示：
    1 <= word.length <= 25
    addWord 中的 word 由小写英文字母组成
    search 中的 word 由 '.' 或小写英文字母组成
    最多调用 104 次 addWord 和 search
 */
@Slf4j
public class WordDictionary_211 {
    private Map<Integer, List<String>> store;
    public WordDictionary_211() {
        store = new HashMap<>();
    }

    public void addWord(String word) {
        // "b-d-3" -> {ArrayList@1158}  size = 1
        List<String> tmp = this.store.getOrDefault(word.length(), new ArrayList<>());
        tmp.add(word);
        this.store.put(word.length(), tmp);
    }

    public boolean search(String word) {

        int length = word.replace(".", "").length();
        if (length == 0){
            return store.keySet().contains(word.length());
        }
        // ..  a.. ..a  a.b  abc .bv.
        List<Integer> keys = store.keySet().stream().filter(v -> v == word.length()).toList();
        for (Integer key : keys) {
            List<String> strings = store.get(key);
            for (String str : strings) {
                boolean flg = false;
                for (int i = 0; i < word.length(); i++) {
                    if (word.charAt(i) == '.') {
                        continue;
                    }
                    if (word.charAt(i) != str.charAt(i)) {
                        flg = false;
                        break;
                    } else {
                        flg = true;
                    }
                }

                if (flg) {
                    return flg;
                }
            }
        }
        return false;
    }


    public static void main(String[] args){
        WordDictionary_211 wordDictionary = new WordDictionary_211();
        wordDictionary.addWord("bad");
        wordDictionary.addWord("dad");
        wordDictionary.addWord("a");
        log.info("{}", wordDictionary.search("pad")); // 返回 False
        log.info("{}", wordDictionary.search("bad")); // 返回 True
        log.info("{}", wordDictionary.search(".ad")); // 返回 True
        log.info("{}", wordDictionary.search(".")); // 返回 True
        log.info("{}", wordDictionary.search("d.d")); // 返回 True
    }
}